package cn.yll.db.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 数据自动填充配置类
 *
 * 填充原理是直接给entity的属性设置值!!!
 * 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null
 * MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充
 * 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段
 * 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入
 * 要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法
 * 不需要根据任何来区分可以使用父类的fillStrategy方法
 * update(T t,Wrapper updateWrapper)时t不能为空,否则自动填充失效
 * @author yangll
 */
@Component
public class MybatisAutoFillConfig implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        if (metaObject.hasSetter("createTime") && Objects.isNull(getFieldValByName("createTime", metaObject))) {
            setFieldValByName("createTime", now, metaObject);
        }
        if (metaObject.hasSetter("modifyTime") && Objects.isNull(getFieldValByName("modifyTime", metaObject))) {
            setFieldValByName("modifyTime", now, metaObject);
        }
        if (metaObject.hasSetter("deleted") && Objects.isNull(getFieldValByName("deleted", metaObject))) {
            //自动填充逻辑删除标识
            setFieldValByName("deleted", 0, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject.hasSetter("modifyTime") && Objects.isNull(getFieldValByName("modifyTime", metaObject))) {
            setFieldValByName("modifyTime", LocalDateTime.now(), metaObject);
        }
    }
}
